package com.atguigu.gmall;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author 李旭
 * @date 2021/11/20 16:17
 * @Description:
 *
 *   异步编排    线程间通信
 *
 *   多线程  JUC课程上
 *
 *
 */
public class CompletableFutureDemo1 {


    public static void main(String[] args) throws Exception{
        //自定义线程池
        ThreadPoolExecutor threadPoolExecutor = new
                ThreadPoolExecutor(
                    5,//核心线程
                    10,//最大线程数
                    3,
                 TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10)
        );

        //开启多线程
    /*    CompletableFuture.supplyAsync(() -> {
            System.out.println("上一个任务的线程名称：" + Thread.currentThread().getName());
           // int j = 10/0;//此处 抛异常
            return "我是异步编排";
        },threadPoolExecutor).whenComplete((t,u) -> {
            //计算完成时的回调方法  ： 计算完成时  成功了  接收上一个任务的返回值  失败了 接收上一个任务的异常
            System.out.println("上一个任务的返回值： t:" + t);//我是异步编排
            System.out.println("上一个任务的异常：u:" + u);//抛异常可以降级处理
            System.out.println("当前任务的线程名称：" + Thread.currentThread().getName());
        });*/

       ////计算完成时
        CompletableFuture<String> completableFutureexceptionally = CompletableFuture.supplyAsync(() -> {
            System.out.println("上一个任务的线程名称：" + Thread.currentThread().getName());
            int j = 10 / 0;//此处 抛异常
            return "我是异步编排";
        }, threadPoolExecutor).whenCompleteAsync((t, u) -> {
            //计算完成时的回调方法  ： 计算完成时  成功了  接收上一个任务的返回值  失败了 接收上一个任务的异常
            System.out.println("上一个任务的返回值： t:" + t);//我是异步编排
            System.out.println("上一个任务的异常：u:" + u);//抛异常可以降级处理
            System.out.println("当前任务的线程名称：" + Thread.currentThread().getName());
        }, threadPoolExecutor).exceptionally(u -> {//exceptionally:就是主线程 main 运行
            System.out.println("当前任务的异常：u:" + u);//抛异常可以降级处理
            System.out.println("下一个任务的线程名称：" + Thread.currentThread().getName());
            return "处理异常成功";
        });

        System.out.println(completableFutureexceptionally.get());//当前主线程 main
        //如果处理失败 可以后继处理 如果成功了 就算了


    }
}
